package com.plugin.manage.service;

import com.plugin.core.model.entity.SysMenu;

import java.util.List;

/**
 * 系统菜单服务接口
 * 
 * @author mark
 * @date 2025-07-28
 */
public interface ISysMenuService {

    /**
     * 新增菜单
     * 
     * @param sysMenu 菜单信息
     * @return 菜单ID
     */
    Long addMenu(SysMenu sysMenu);

    /**
     * 删除菜单
     * 
     * @param menuId 菜单ID
     * @return 是否成功
     */
    boolean deleteMenu(Long menuId);

    /**
     * 更新菜单
     * 
     * @param sysMenu 菜单信息
     * @return 是否成功
     */
    boolean updateMenu(SysMenu sysMenu);

    /**
     * 根据ID查询菜单
     * 
     * @param menuId 菜单ID
     * @return 菜单信息
     */
    SysMenu getMenuById(Long menuId);

    /**
     * 分页查询菜单列表
     * 
     * @param offset 偏移量
     * @param limit 限制数量
     * @param sysMenu 查询条件
     * @return 菜单列表
     */
    List<SysMenu> getMenuList(int offset, int limit, SysMenu sysMenu);

    /**
     * 查询所有菜单
     * 
     * @return 菜单列表
     */
    List<SysMenu> getAllMenus();

    /**
     * 统计菜单数量
     * 
     * @param sysMenu 查询条件
     * @return 菜单数量
     */
    Integer countMenus(SysMenu sysMenu);

    /**
     * 检查菜单名称是否存在
     * 
     * @param menuName 菜单名称
     * @param parentId 父菜单ID
     * @param menuId 菜单ID（编辑时排除自己）
     * @return 是否存在
     */
    boolean checkMenuNameExists(String menuName, Long parentId, Long menuId);

    /**
     * 根据父菜单ID查询子菜单
     * 
     * @param parentId 父菜单ID
     * @return 子菜单列表
     */
    List<SysMenu> getMenusByParentId(Long parentId);

    /**
     * 构建菜单树
     * 
     * @param parentId 父菜单ID
     * @return 菜单树
     */
    List<SysMenu> buildMenuTree(Long parentId);

    /**
     * 根据用户ID查询用户菜单
     * 
     * @param userId 用户ID
     * @return 菜单列表
     */
    List<SysMenu> getMenusByUserId(Long userId);

    /**
     * 根据角色ID查询角色菜单
     * 
     * @param roleId 角色ID
     * @return 菜单列表
     */
    List<SysMenu> getMenusByRoleId(Long roleId);

    /**
     * 根据系统类型查询菜单
     * 
     * @param system 系统类型
     * @return 菜单列表
     */
    List<SysMenu> getMenusBySystem(Integer system);

    /**
     * 根据菜单类型查询菜单
     * 
     * @param menuType 菜单类型
     * @return 菜单列表
     */
    List<SysMenu> getMenusByType(String menuType);

    /**
     * 查询正常状态的菜单
     * 
     * @return 菜单列表
     */
    List<SysMenu> getActiveMenus();

    /**
     * 根据权限标识查询菜单
     * 
     * @param perms 权限标识
     * @return 菜单信息
     */
    SysMenu getMenuByPerms(String perms);

    /**
     * 导出菜单数据
     * 
     * @param queryMenu 查询条件
     * @return 菜单列表
     */
    List<SysMenu> exportMenus(SysMenu queryMenu);

    /**
     * 获取菜单选择列表
     * 
     * @return 菜单选择项列表
     */
    List<SysMenu> getMenuSelectList();
}
